﻿using BlogsAPI.Sites;

namespace BlogsAPI.Search
{
    using Abstract;
    using Twitterizer;
    using System.Diagnostics;
    using System;

    /// <summary>
    /// Класс для работы с поиском по ТВИТТАМ
    /// </summary>
    /// <seealso cref="http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search"/>
    public class TwiSearch : BasicSearch
    {
        /// <summary>
        /// максимальное число подгружаемых в поиске страниц
        /// </summary>
        private const int MAXPAGES = 30;

        /// <summary>
        /// Где находятся настройки для твиттера
        /// </summary>
        public string DefaultConfig;

        /// <summary>
        /// Конструктор
        /// </summary>
        public TwiSearch() : this(Configuration.DefaultFile)
        {
        }

        /// <summary>
        /// Конструктор
        /// </summary>
        public TwiSearch(string cfg)
        {
            separator_and = " ";
            separator_or = " OR ";
            separator_not = "-";
            DefaultConfig = cfg;
        }

        /// <summary>
        /// Формирование разобранного поста из того что дает яндекс.
        /// </summary>
        /// <param name="tsr"></param>
        /// <returns></returns>
        private BlogPost ParseBlogPost(TwitterStatus tsr)
        {
            return new BlogPost
            {
                Link = new Uri(String.Format("http://twitter.com/{0}/status/{1}",tsr.User.ScreenName,tsr.Id)),
                Body = tsr.Text,
                Existance = true,
                Published = tsr.CreatedDate
            };
        }

        /// <summary>
        /// </summary>
        /// <param name="text">текст для поиска</param>
        /// <param name="fromDate">дата начиная с которой искать объекты, может быть нулом, тогда по максимуму!</param>
        /// <returns>массив постов удовлетворяющих поиску</returns>
        public override BlogPost[] SearchFor(String text, DateTime? fromDate)
        {
            var oRes = new BlogPost[0];
            try
            {
                var so = new SearchOptions
                    {
                        Language = "ru",
                        ResultType = SearchOptionsResultType.Recent
                    };
                for (int p = 1; p <= MAXPAGES; p++)
                {
                    TwitterResponse<TwitterSearchResultCollection> tRes =
                        TwitterSearch.Search(Configuration.GetTokens(Twitter.oSelf.username,
                        DefaultConfig), text, so);

                    if (tRes.ResponseObject != null && tRes.ResponseObject.Count > 0)//если есть данные
                    {
                        foreach (TwitterStatus twitterSearchResult in tRes.ResponseObject)
                        {
                            
                            //если пост слишком старый, то заканчиваем работу.
                            if ((fromDate != null && twitterSearchResult.CreatedDate < fromDate)
                                )//слишком 
                            {
                                //p = MAXPAGES;
                                break;
                            }
                            BlogPost bp = ParseBlogPost(twitterSearchResult);
                            if (bp != null)
                            {
                                Array.Resize(ref oRes, oRes.Length + 1);
                                oRes[oRes.Length - 1] = bp;
                            }
                        }
                    }else
                    {
                        break;//skip other pages
                    }
                }
            }
            catch (Exception e1)
            {
                Debug.WriteLine("SearchFor failed cause " + e1.Message);
            }
            return oRes;
        }
    }
}
